假如靠Gemini幫忙做出已有的小遊戲,就感覺沒什麼特別的。所以我打算更換障礙物,把障礙物用成隨機生成,玩法就會從控制力道鑽過縫隙,改成繞過障礙物看誰堅持最久。
這次使用上下不同的岩石來當作障礙物,和之前使用一張圖片的上下水管不同,這次將上下障礙物拆成兩個不同的 Prefab,讓它們可以分開生成。
這樣之後如果想繼續增加其他不同的障礙物,也比較容易進行修改。
今天主要希望做到:
using UnityEngine;
public class RockSpawner : MonoBehaviour
{
[Header("岩石 Prefab 設定")]
[Tooltip("上方岩石 Prefab(鐘乳石/上方障礙物)")]
public GameObject topRockPrefab;
[Tooltip("下方岩石 Prefab(石筍/下方障礙物)")]
public GameObject bottomRockPrefab;
[Header("生成位置設定")]
[Tooltip("上方岩石生成的固定 Y 座標(例如 3.5)")]
public float topYPosition = 3.5f;
[Tooltip("下方岩石生成的固定 Y 座標(例如 -3.5)")]
public float bottomYPosition = -3.5f;
[Tooltip("Y 軸位置的隨機微調幅度(讓岩石高低有些微變化)")]
public float yOffset = 0.5f;
[Header("生成頻率與速度")]
[Tooltip("生成時間間隔(秒)")]
public float spawnRate = 2f;
[Tooltip("當前障礙物移動速度")]
public float currentSpeed = 4f;
[Tooltip("每次加速增加的數值")]
public float speedIncreaseAmount = 0.8f;
[Tooltip("加速的時間間隔(預設 30 秒)")]
public float speedUpInterval = 30f;
private float spawnTimer = 0f;
private float speedTimer = 0f;
void Start()
{
SpawnRock();
}
void Update()
{
// 1. 生成障礙物計時器
spawnTimer += Time.deltaTime;
if (spawnTimer >= spawnRate)
{
SpawnRock();
spawnTimer = 0f;
}
// 2. 每 30 秒動態加速計時器
speedTimer += Time.deltaTime;
if (speedTimer >= speedUpInterval)
{
currentSpeed += speedIncreaseAmount;
if (spawnRate > 0.8f)
{
spawnRate -= 0.1f;
}
// 更新背景與地板速度
BackgroundRepeat[] scrollables = FindObjectsOfType<BackgroundRepeat>();
foreach (var bg in scrollables)
{
bg.UpdateSpeed(currentSpeed);
}
speedTimer = 0f;
Debug.Log($"【難度提升】30秒已到!目前速度加快至:{currentSpeed},生成間隔:{spawnRate} 秒");
}
}
void SpawnRock()
{
// 【核心機制】:二選一判定(50% 機率生成上岩石,50% 機率生成下岩石)
bool isTopRock = Random.value > 0.5f;
GameObject prefabToSpawn = isTopRock ? topRockPrefab : bottomRockPrefab;
// 根據是上還是下,決定基礎 Y 軸位置,並加上微幅隨機偏移
float targetY = isTopRock ? topYPosition : bottomYPosition;
targetY += Random.Range(-yOffset, yOffset);
Vector3 spawnPosition = new Vector3(transform.position.x, targetY, 0);
// 實例化岩石
GameObject newRock = Instantiate(prefabToSpawn, spawnPosition, Quaternion.identity);
// 傳遞最新速度給岩石(岩石依然掛載原本的 PipeMove.cs 即可)
PipeMove rockMove = newRock.GetComponent<PipeMove>();
if (rockMove != null)
{
rockMove.moveSpeed = currentSpeed;
}
}
}
這次是以數天前製作的PipeMove來做改良,因此不用為了岩石重新製作移動程式,只需要處理岩石的生成方式即可。
目前已經完成鳥、背景與地板的移動,以及障礙物的生成,接下來會開始嘗試新增道具,可能會從AI生圖開始,畢竟這個人不太會畫畫,到時候也會分享生成出來的圖片。
之前有想到玉米、彩色羽毛以及隱形道具等,目前還是先當作構想,會等基本玩法再穩定一些後,再慢慢嘗試加入。
如果實際製作後發現太複雜,也會再依照當時的進度調整。
今天主要是把原本的水管障礙物換掉,並嘗試讓上下障礙物分開生成。
想著不能一昧地照著原遊戲進行製作,所以得要增加一點自己的想法,也因此需要多花幾天慢慢進行修改。
這次也是第一次製作兩個分開生成,而且不能同時生成的物件,所以我先把自己的想法告訴Gemini,詢問它如何做到,能不能辦到,再慢慢學習要怎麼在遊戲中實現這個想法。
目前遊戲還在製作當中,接下來會繼續嘗試加入新的遊戲元素。